#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File   : b_object_program_meta2.py
# @Email  : xuexia_xu@feidee.com
# @Time   : 2024/3/29 11:05
# @Desc   : metaclass
"""
metaclass，直译为元类，先定义metaclass，就可以创建类，最后创建实例。
"""
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


# metaclass是类的模板，所以必须从`type`类型派生：
class ListMetaclass(type):
    """
    __new__()方法接收到的参数依次是：
    1.当前准备创建的类的对象；
    2.类的名字；
    3.类继承的父类集合；  ？？？
    4.类的方法集合。
    """

    def __new__(cls, name, bases, attrs):
        logger.info(f"\n name:{name},\n bases:{bases},\n attrs:{attrs} ")
        attrs['add'] = lambda self, value: self.append(value)
        return type.__new__(cls, name, bases, attrs)


# 有了ListMetaclass，我们在定义类的时候还要指示使用ListMetaclass来定制类，传入关键字参数metaclass
class MyList(list, metaclass=ListMetaclass):
    def __init__(self):
        logger.info(f"MyList __init__")


class User(MyList):
    def __init__(self):
        logger.info(f"MyList __init__")


if __name__ == "__main__":
    # L = User()
    # L.add(1)
    # print(L)

    # L2 = list()
    # L2.add(2)
    pass
